// Copyright (C), 2012-2018, Sichuan Xiaoka Technology Co., Ltd.
package analysis;


import annotation.FieldTypeExcel;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * excel 参数处理类封装
 *
 * @author 张鹏
 */
public class ExcelValueHandle {
    /**
     * 注解处理
     *
     * @param clasz 类型
     * @return
     */
    public static Map<String, String> annotationExcel(Class clasz) {
        Map<String, String> map = new HashMap<>(16);
        // 此处要用反射将字段中的注解解析出来
        // 判断类上是否有次注解
        Field[] fields = clasz.getDeclaredFields();
        for (Field field : fields) {
            boolean clzHasAnno = field.isAnnotationPresent(FieldTypeExcel.class);
            if (clzHasAnno) {
                // 获取类上的注解
                FieldTypeExcel annotation = field.getAnnotation(FieldTypeExcel.class);
                // 输出注解上的属性
                String key = annotation.value();
                map.put(key, field.getName());
            }
        }
        return map;
    }

    /**
     * 注解处理
     *
     * @param clasz 类型
     * @return
     */
    public static Map<String, String[]> annotationExcelToArray(Class clasz) {
        Map<String, String[]> map = new HashMap<>(16);
        // 此处要用反射将字段中的注解解析出来
        // 判断类上是否有次注解
        Field[] fields = clasz.getDeclaredFields();
        for (Field field : fields) {
            boolean clzHasAnno = field.isAnnotationPresent(FieldTypeExcel.class);
            if (clzHasAnno) {
                // 获取类上的注解
                FieldTypeExcel annotation = field.getAnnotation(FieldTypeExcel.class);
                // 输出注解上的属性
                String key = annotation.value();
                String time = annotation.time();
                String[] type = annotation.type();

                String[] array = new String[3];
                array[0] = field.getName();
                if (StringUtils.isNotBlank(time)) {
                    Class<?> type1 = field.getType();
                    if (type1 == Long.class) {
                        array[1] = time;
                    } else {
                        array[1] = "";
                    }
                } else {
                    array[1] = "";
                }
                if (type != null) {

                    StringBuffer stringBuffer = new StringBuffer();
                    for (int i = 0; i < type.length; i++) {
                        stringBuffer.append(type[i]).append(",");
                    }
                    stringBuffer.deleteCharAt(stringBuffer.length() - 1);
                    array[2] = stringBuffer.toString();
                } else {
                    array[2] = "";
                }
                map.put(key, array);
            }
        }
        return map;
    }

    /**
     * 根据属性，拿到set方法，并把值set到对象中
     *
     * @param obj       对象
     * @param clazz     对象的class
     * @param filedName 需要设置值得属性
     * @param value
     */
    public static void setValue(Object obj, Class<?> clazz, String filedName, Object value) throws NoSuchFieldException {
        Class<?> typeClass = clazz.getDeclaredField(filedName).getType();
        String methodName = "set" + filedName.substring(0, 1).toUpperCase() + filedName.substring(1);
        try {
            Method method = clazz.getDeclaredMethod(methodName, new Class[]{typeClass});
            method.invoke(obj, new Object[]{getClassTypeValue(typeClass, value)});
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    /**
     * 通过class类型获取获取对应类型的值
     *
     * @param typeClass class类型
     * @param value     值
     * @return Object
     */
    private static Object getClassTypeValue(Class<?> typeClass, Object value) {
        if (typeClass == int.class || value instanceof Integer) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == short.class) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == byte.class) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == double.class) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == long.class) {
            if (null == value) {
                return 0;
            }
            return value;
        } else if (typeClass == String.class) {
            if (null == value) {
                return "";
            }
            return value;
        } else if (typeClass == boolean.class) {
            if (null == value) {
                return true;
            }
            return value;
        } else if (typeClass == BigDecimal.class) {
            if (null == value) {
                return new BigDecimal(0);
            }
            return new BigDecimal(value + "");
        } else {
            return typeClass.cast(value);
        }
    }
}
